package com.jvm.reentrantlockp;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

// ReentrantLock 锁申请等待限时
// tryLock() 无参方法会立即返回

/**
 *
 * 关于 tryLock()方法和 tryLock(long timeout, TimeUnit unit)方法，说明一下：
 *      1 都会返回 boolean 值，结果表示获取锁是否成功
 *      2 tryLock()方法，不管是否获取成功，都会立即返回；
     *      而有参的 tryLock 方法会尝试在指定的时间内去获取锁，
     *      中间会阻塞的现象，在指定的时间之后会不管是否能够获取锁都会返回结果
 *      3 tryLock()方法不会响应线程的中断方法；
     *      而有参的 tryLock 方法会响应线程的中断方法，
     *      而触发InterruptedException异常，
     *      这个从 2 个方法的声明上可以可以看出来
 *
 *
 */
public class Demo8 {
    private static ReentrantLock lock1 = new ReentrantLock(false);

    public static class T extends Thread {

        public T(String name) {
            super(name);
        }

        @Override
        public void run() {
            try {
                System.out.println(System.currentTimeMillis() + ":" +
                        this.getName() + " 开始获取锁！");
                // tryLock()是立即响应的，中间不会有阻塞。
                if (lock1.tryLock()) {
                    System.out.println(System.currentTimeMillis() + ":" +
                            this.getName() + "获取到了锁！");
                    // 获取锁之后，休眠5秒
                    TimeUnit.SECONDS.sleep(5);
                } else {
                    System.out.println(System.currentTimeMillis() + ":" +
                            this.getName() + "未能获取到锁！");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("中断标志：" + this.isInterrupted());
            } finally {
                // 实例方法，判断当前线程是否持有 ReentrantLock 的锁
                if (lock1.isHeldByCurrentThread()) {
                    lock1.unlock();
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {

        /**
         *
         * jps
         * jstack 进程id       查看
         *
         */
        T t1 = new T("t1");
        T t2 = new T("t2");

        t1.start();
        t2.start();

    }
}
